home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Edition 10 / FreelogHS10.iso / Buzz / Buzz_Advanced_Pack.exe / {app} / Dev / Elak SVF.cpp < prev    next >
C/C++ Source or Header  |  2001-08-27  |  3KB  |  180 lines

  1.  
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <assert.h>
  5. #include <math.h>
  6. #include "../MachineInterface.h"
  7.  
  8. CMachineParameter const paraFC =
  9. {
  10.     pt_word,                                        // type
  11.     "cf",
  12.     "Cut-off frequency",                            // description
  13.     0,                                                // MinValue
  14.     1000,                                            // MaxValue
  15.     2000,                                            // NoValue
  16.     MPF_STATE,                                        // Flags
  17.     0x200,
  18. };
  19.  
  20. CMachineParameter const paraResonance =
  21. {
  22.     pt_word,                                        // type
  23.     "Resonance",
  24.     "Resonance",                                    // description
  25.     0,                                                // MinValue
  26.     0xFFFE,                                            // MaxValue
  27.     0xFFFF,                                            // NoValue
  28.     MPF_STATE,                                        // Flags
  29.     0x200,
  30. };
  31.  
  32.  
  33. CMachineParameter const *pParameters[] =
  34. {
  35.     // global
  36.     ¶FC,
  37.     ¶Resonance
  38. };
  39.  
  40. CMachineAttribute const attrSymmetric =
  41. {
  42.     "Symmetric",
  43.     0,
  44.     1,
  45.     0
  46. };
  47.  
  48.  
  49. #pragma pack(1)
  50.  
  51. class gvals
  52. {
  53. public:
  54.     word fc;
  55.     word resonance;
  56. };
  57.  
  58. #pragma pack()
  59.  
  60. CMachineInfo const MacInfo =
  61. {
  62.     MT_EFFECT,                                // type
  63.     MI_VERSION,
  64.     0,                                        // flags
  65.     0,                                        // min tracks
  66.     0,                                        // max tracks
  67.     2,                                        // numGlobalParameters
  68.     0,                                        // numTrackParameters
  69.     pParameters,
  70.     0,
  71.     0,
  72. #ifdef _DEBUG
  73.     "SVF Filter (Debug build)",                // name
  74. #else
  75.     "SVF Filter",                            // name
  76. #endif
  77.     "SVF",                                    // short name
  78.     "Elak",                                    // author
  79.     NULL
  80. };
  81.  
  82.  
  83. class mi : public CMachineInterface
  84. {
  85. public:
  86.     mi();
  87.     virtual ~mi();
  88.  
  89.     virtual void Init(CMachineDataInput * const pi);
  90.     virtual void Tick();
  91.     virtual bool Work(float *psamples, int numsamples, int const mode);
  92.  
  93. private:
  94.  
  95.  
  96.  
  97. private:
  98.     float fc;
  99.     float resonance;
  100.     float fs;
  101.     float hi;
  102.     float lo;
  103.     float bp;
  104.     float f;
  105.  
  106.     gvals gval;
  107. };
  108.  
  109. DLL_EXPORTS
  110.  
  111. mi::mi()
  112. {
  113.     GlobalVals = &gval;
  114. }
  115.  
  116. mi::~mi()
  117. {
  118. }
  119.  
  120. void mi::Init(CMachineDataInput * const pi)
  121. {
  122.     fc = 500.0f;
  123.  
  124.     fs = 22500.0f;
  125.  
  126.  
  127.     lo = 0.0f;
  128.     bp = 0.0f;
  129.     f  = 0.0f;
  130.     hi = 0.0f;
  131.  
  132.     lo = bp = 0.0f;
  133.  
  134. }
  135.  
  136. void mi::Tick()
  137. {
  138.  
  139.     if (gval.fc != paraFC.NoValue)
  140.         fc = (float)(gval.fc);
  141.  
  142.     if( gval.resonance != paraResonance.NoValue)
  143.         resonance = (float)(gval.resonance)/65535;
  144.  
  145.     //these should really be initialized after a note has is finished playing, or is it when f = 0;
  146.     f = 6*fc/fs;
  147. }
  148.  
  149.  
  150.  
  151. bool mi::Work(float *psamples, int numsamples, int const mode)
  152. {
  153.     if (mode == WM_WRITE || mode == WM_NOIO)
  154.         return false;
  155.  
  156.     if (mode == WM_READ)
  157.         return true;
  158.     do
  159.     {
  160.         float in = *psamples/65534.0f; //calculations on float, more fun
  161.  
  162.         hi  = in - lo - (1-resonance)*bp;
  163.         bp += f*hi;
  164.         lo += f*bp;
  165.  
  166.         if (lo >  1.0f) lo =  1.0f;
  167.         if (lo < -1.0f) lo = -1.0f;
  168.  
  169.         *psamples = (lo*65534.0f);    //boost the volume ?!?
  170.         f *= 0.99998f;          // exponential - case
  171.  
  172.         psamples++;
  173.  
  174.     } while(--numsamples);
  175.  
  176.     return true;
  177. }
  178.  
  179.  
  180.